home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Text⁄Files / Voyeur 1.1.1 / Voyeur ƒ / v code ƒ / v hex.c < prev    next >
Text File  |  1994-02-26  |  4KB  |  153 lines

  1. /**********************************************************************\
  2.  
  3. File:        v hex.c
  4.  
  5. Purpose:    This module handles hex numbers as strings and strings as
  6.             hex numbers.
  7.  
  8.  
  9. Voyeur -- a no-frills file viewer
  10. Copyright ©1993-4, Mark Pilgrim
  11.  
  12. This program is free software; you can redistribute it and/or modify
  13. it under the terms of the GNU General Public License as published by
  14. the Free Software Foundation; either version 2 of the License, or
  15. (at your option) any later version.
  16.  
  17. This program is distributed in the hope that it will be useful,
  18. but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20. GNU General Public License for more details.
  21.  
  22. You should have received a copy of the GNU General Public License
  23. along with this program in a file named "GNU General Public License".
  24. If not, write to the Free Software Foundation, 675 Mass Ave,
  25. Cambridge, MA 02139, USA.
  26.  
  27. \**********************************************************************/
  28.  
  29. #include "v hex.h"
  30. #include "program globals.h"
  31.  
  32. void HexStringToAsciiString(Str255 hexString, Str255 asciiString)
  33. {
  34.     int                i;
  35.     
  36.     if (hexString[0]&1)
  37.     {
  38.         hexString[hexString[0]+1]=hexString[hexString[0]];
  39.         hexString[hexString[0]]='0';
  40.         hexString[0]++;
  41.     }
  42.     asciiString[0]=0x00;
  43.     for (i=1; i<=hexString[0]; i+=2)
  44.         asciiString[++asciiString[0]]=
  45.             ((hexString[i]-((hexString[i]>'9') ? 'A' : '0'))<<4) +
  46.             hexString[i+1]-((hexString[i+1]>'9') ? 'A' : '0');
  47. }
  48.  
  49. void LongToHexString(unsigned long input, Str255 result)
  50. {
  51.     result[0]=0x08;
  52.     result[1]=hexchar[0][(input>>24)&0xff];
  53.     result[2]=hexchar[1][(input>>24)&0xff];
  54.     result[3]=hexchar[0][(input>>16)&0xff];
  55.     result[4]=hexchar[1][(input>>16)&0xff];
  56.     result[5]=hexchar[0][(input>>8)&0xff];
  57.     result[6]=hexchar[1][(input>>8)&0xff];
  58.     result[7]=hexchar[0][input&0xff];
  59.     result[8]=hexchar[1][input&0xff];
  60. }
  61.  
  62. Boolean ValidHex(Str255 tempStr)
  63. {
  64.     int            i;
  65.     
  66.     for (i=1; i<=tempStr[0]; i++)
  67.         if (!(((tempStr[i]>='0') && (tempStr[i]<='9')) ||
  68.             (((tempStr[i]|0x20)>='a') && ((tempStr[i]|0x20)<='f'))))
  69.             return FALSE;
  70.     
  71.     return TRUE;
  72. }
  73.  
  74. unsigned long HexStringToLong(Str255 tempStr)
  75. {
  76.     int                i;
  77.     unsigned long    result;
  78.     unsigned long    mult;
  79.     unsigned long    digit;
  80.     
  81.     while (tempStr[0]<8)
  82.     {
  83.         for (i=tempStr[0]; i>0; i--)
  84.             tempStr[i+1]=tempStr[i];
  85.         tempStr[1]='0';
  86.         tempStr[0]++;
  87.     }
  88.  
  89.     mult=1L;
  90.     result=0L;
  91.     for (i=8; i>0; i--)
  92.     {
  93.         if ((tempStr[i]>='0') && (tempStr[i]<='9'))
  94.             digit=tempStr[i]-'0';
  95.         else
  96.             digit=(tempStr[i]|0x20)-'a'+10;
  97.         result+=digit*mult;
  98.         mult=mult<<4;
  99.     }
  100.     
  101.     return result;
  102. }
  103.  
  104. pascal Boolean HexOFilter(DialogPtr theDialog, EventRecord *theEvent, short *theItem)
  105. {
  106.     unsigned char    theChar;
  107.     short            itemType;
  108.     Handle            itemH;
  109.     Rect            box;
  110.     unsigned long    dummy;
  111.     
  112.     switch (theEvent->what)
  113.     {
  114.         case keyDown:
  115.         case autoKey:
  116.             theChar=theEvent->message & charCodeMask;
  117.             if ((theChar==0x0d) || (theChar==0x03))
  118.             {
  119.                 *theItem=1;
  120.                 GetDItem(theDialog, 1, &itemType, &itemH, &box);
  121.                 HiliteControl((ControlHandle)itemH, 1);
  122.                 Delay(8, &dummy);
  123.                 HiliteControl((ControlHandle)itemH, 0);
  124.                 return TRUE;
  125.             }
  126.             if ((theChar==0x1b) ||
  127.                 ((theEvent->modifiers & cmdKey) && (theChar=='.')))
  128.             {
  129.                 *theItem=2;
  130.                 GetDItem(theDialog, 2, &itemType, &itemH, &box);
  131.                 HiliteControl((ControlHandle)itemH, 1);
  132.                 Delay(8, &dummy);
  133.                 HiliteControl((ControlHandle)itemH, 0);
  134.                 return TRUE;
  135.             }
  136.             if ((theChar>='a') && (theChar<='f'))
  137.                 theEvent->message&=0xffffffdf;    /* convert to uppercase */
  138.             else if ((theChar>='A') && (theChar<='F'));
  139.             else if ((theChar>='0') && (theChar<='9'));
  140.             else if ((theChar==0x08) || (theChar==0x09) ||
  141.                     ((theChar>=0x1c) && (theChar<=0x1f)));
  142.             else if (theEvent->modifiers&cmdKey);
  143.             else
  144.             {
  145.                 SysBeep(7);
  146.                 theEvent->what=nullEvent;
  147.             }
  148.             break;
  149.     }
  150.     
  151.     return FALSE;
  152. }
  153.